package com.fstec.ks.master;

import java.io.File;
import java.util.Date;
import java.util.List;

import com.fstec.ks.master.bean.ExamRoundBean;
import com.fstec.ks.master.bean.ExamRunInfo;
import com.fstec.ks.master.bean.ExamServerBean;
import com.fstec.ks.master.bean.ServerInfoBean;
import com.fstec.ks.master.vo.ExamRoundVO;
import com.fstec.ks.master.vo.ExamServerVO;
import com.sinotn.ks.definition.Computer;
import com.sinotn.ks.definition.RequestMessage;

/**
 * 服务监测引擎
 * @Title MasterEngine.java
 * @Package com.fstec.ks.master
 * @Description 
 * Copyright: Copyright (c) 2023
 * Company:广东峰上科技有限公司
 * 
 * @author <a href="mailto:xieqj@fstec.com">谢启进</a>
 * @date 2023年10月6日 下午4:19:35
 * @version V1.0
 */
public interface MasterEngine {
	/**
	 * 获取系统版本号
	 * @return
	 * @auth <a href="mailto:xieqj@fstec.com">谢启进</a>
	 * @date 2016年11月5日 下午3:31:45
	 */
	String getVersion();
	/**
	 * 获取参数serverId相关注册的考试服务信息
	 * @param serverId
	 * @return
	 * @auth <a href="mailto:xieqj@fstec.com">谢启进</a>
	 * @date 2023年10月19日 下午6:09:33
	 */
	ExamServerVO getExamServer(String serverId);

	/**
	 * 获取客户端版本号
	 * @return
	 * @auth <a href="mailto:xieqj@fstec.com">谢启进</a>
	 * @date 2016年11月12日 下午4:50:27
	 */
	String getClientVersion();
	/**
	 * 获取监控服务器授权信息,保证返回不为空
	 * @return
	 * @auth <a href="mailto:xieqj@fstec.com">谢启进</a>
	 * @date 2023年10月9日 下午5:56:33
	 */
	ServerInfoBean getServerInfo();
	/**
	 * 刷新监控授权号
	 * @return
	 * @auth <a href="mailto:xieqj@fstec.com">谢启进</a>
	 * @date 2023年10月10日 上午9:55:19
	 */
	String refreshAuth();
	/**
	 * 监测服务重新绑定参数Ip信息
	 * @param ipAddr
	 * @return
	 * @auth <a href="mailto:xieqj@fstec.com">谢启进</a>
	 * @date 2023年10月10日 上午10:17:07
	 */
	ServerInfoBean rebindIpAddr(String ipAddr);
	/**
	 * 考试服务器网络连接到监控服务器
	 * @param computer
	 * @auth <a href="mailto:xieqj@fstec.com">谢启进</a>
	 * @date 2023年10月10日 下午2:45:08
	 */
	void onComputerConnect(Computer computer);
	/**
	 * 考试服务器断开与监控服务器网络连接
	 * @param computer
	 * @auth <a href="mailto:xieqj@fstec.com">谢启进</a>
	 * @date 2023年10月10日 下午2:45:45
	 */
	void onComputerDisconnect(Computer computer);
	/**
	 * 考试服务器与监控服务器网络连接通讯异常
	 * @param computer
	 * @param cause
	 * @auth <a href="mailto:xieqj@fstec.com">谢启进</a>
	 * @date 2023年10月10日 下午2:46:17
	 */
	void onSocketException(Computer computer, Throwable cause);
	/**
	 * 监控服务器接收到考试服务器发送的请求信息
	 * @param computer
	 * @param msg
	 * @auth <a href="mailto:xieqj@fstec.com">谢启进</a>
	 * @date 2023年10月10日 下午2:46:39
	 */
	void onMessageReceive(Computer computer, RequestMessage msg);
	/**
	 * 获取所有考试场次数据
	 * @return
	 * @auth <a href="mailto:xieqj@fstec.com">谢启进</a>
	 * @date 2023年10月11日 上午9:45:48
	 */
	List<ExamRoundBean> allExamRounds();
	/**
	 * 获取指定场次时间的考试服务器监控信息
	 * @param beginTime
	 * @param endTime
	 * @return
	 * @auth <a href="mailto:xieqj@fstec.com">谢启进</a>
	 * @date 2023年10月11日 上午9:51:05
	 */
	List<ExamServerBean> getExamServers(Date beginTime, Date endTime, boolean force);
	/**
	 * 重新加载数据库数据
	 * @auth <a href="mailto:xieqj@fstec.com">谢启进</a>
	 * @date 2023年10月13日 上午9:16:03
	 */
	void reloadData();
	/**
	 * 获取考试服务器注册锁
	 * @auth <a href="mailto:xieqj@fstec.com">谢启进</a>
	 * @date 2023年10月13日 下午3:37:52
	 */
	void lockServerReg();
	/**
	 * 释放考试服务器注册锁
	 * @auth <a href="mailto:xieqj@fstec.com">谢启进</a>
	 * @date 2023年10月13日 下午3:38:12
	 */
	void unlockServerReg();
	/**
	 * 是否有参数指定场次数据
	 * @param beginTime
	 * @param endTime
	 * @return
	 * @auth <a href="mailto:xieqj@fstec.com">谢启进</a>
	 * @date 2023年10月13日 下午3:38:33
	 */
	boolean hasRound(Date beginTime, Date endTime);
	/**
	 * 程序数据备份
	 * @param serverId
	 * @param bakFile
	 * @auth <a href="mailto:xieqj@fstec.com">谢启进</a>
	 * @date 2023年10月13日 下午3:39:00
	 */
	void backupServer(String serverId, File bakFile);
	/**
	 * 更新考试运行状态数据
	 * @param examRunInfo
	 * @auth <a href="mailto:xieqj@fstec.com">谢启进</a>
	 * @date 2023年10月13日 下午3:39:58
	 */
	void updateExamInfo(String serverId, ExamRunInfo examRunInfo);
	/**
	 * 场次数据备份
	 * @param serverId
	 * @param uploadTime
	 * @param examRounds 
	 * @param bakFile
	 * @auth <a href="mailto:xieqj@fstec.com">谢启进</a>
	 * @date 2023年10月13日 下午3:40:27
	 */
	void backupRoundData(String serverId, Date uploadTime, List<ExamRoundVO> examRounds, File bakFile);
	/**
	 * 删除指定考试服务
	 * @param serverId
	 * @auth <a href="mailto:xieqj@fstec.com">谢启进</a>
	 * @date 2023年10月21日 下午11:11:52
	 */
	void removeServer(String serverId);
}
